#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include "ioUDP.h"
#include "ioSerial.h"

WiFiUDP UDP;

IPAddress remoteIP;//客户端ip地址
uint16_t remoteport;//客户端端口

char incomingPacket[UDP_PACKET_SIZE]; // buffer for incoming packets

/************************************************************************
* 函数名称: udpInit()
* 输入参数: 无
* 返回值  : 无
* 功    能: UDP初始化
**********************************************************************/
void udpInit()
{
    UDP.begin(UDP_PORT);
    DEBUGF("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), UDP_PORT);
}

/************************************************************************
* 函数名称: udpRecive()
* 输入参数: 无
* 返回值  : 无
* 功    能: 主线程中调用，udp接收函数
**********************************************************************/
char *udpRecive()
{
    int packetSize = UDP.parsePacket();
    if (packetSize)
    {
        /* receive incoming UDP packets */
        DEBUGF("Received %d bytes from %s, port %d\n", packetSize, UDP.remoteIP().toString().c_str(), UDP.remotePort());
        remoteIP = UDP.remoteIP();
        remoteport = UDP.remotePort();
        int len = UDP.read(incomingPacket, 1024);
        if (len > 0)
        {
            incomingPacket[len] = 0;
        }
        return incomingPacket;
    }
    return nullptr;
}

/************************************************************************
* 函数名称: sendUDP()
* 输入参数: JSON字符串，指定ip
* 返回值  : 无
* 功    能: 发送udp数据，端口默认43671
**********************************************************************/
uint32_t sendUDP(StaticJsonDocument<1024> *udp_msg_doc, IPAddress ip)
{
    UDP.beginPacket(ip, 43671);
    serializeJson(*udp_msg_doc, UDP);
    return UDP.endPacket();
}
/************************************************************************
* 函数名称: sendUDP()
* 输入参数: JSON字符串，指定ip
* 返回值  : 无
* 功    能: 发送udp数据，端口默认43671
**********************************************************************/
uint32_t sendUDP_buffer(uint8_t *buffer, int length)
{
    IPAddress ip;
    ip.fromString("255.255.255.255");
    UDP.beginPacket(ip, 43672);
    UDP.write(buffer, length);
    return UDP.endPacket();
}

/************************************************************************
* 函数名称: returnUDP()
* 输入参数: JSON字符串，指定ip
* 返回值  : 无
* 功    能: 返回UDP数据
**********************************************************************/
uint32_t returnUDP(StaticJsonDocument<1024> *udp_msg_doc)
{
    if (remoteport == 43671)
    {
        UDP.beginPacket(remoteIP, 43671);
    }
    else
    {
        UDP.beginPacket(remoteIP, 4210);
    }

    serializeJson(*udp_msg_doc, UDP);
    return UDP.endPacket();
}